<!-- 公共主体 -->

<template>
  <div class="CommonBody">
    <!-- 结构树 -->
    <BodyTree v-bind="$props" @change="toChange" @expand="toExpand" @collapse="toCollapse">
      <template #treeTop>
        <slot name="treeTop" />
      </template>
      <template #treeNode="{ data, node, nodeClass }">
        <slot name="treeNode" :data="data" :node="node" :nodeClass="nodeClass" />
      </template>
      <template #treeBottom>
        <slot name="treeBottom" />
      </template>
    </BodyTree>

    <!-- 自定义 -->
    <BodyDiy v-bind="$props">
      <slot />
    </BodyDiy>

    <BodyCard v-bind="$props">
      <template v-if="hasHeader" #header>
        <slot name="header" />
      </template>

      <template v-if="hasStatistic" #statistic>
        <slot name="statistic" />
      </template>

      <template v-if="hasSearch" #search>
        <slot name="search" />
      </template>

      <template v-if="hasTable" #table>
        <slot name="table" />
      </template>

      <slot />

      <template v-if="hasFooter" #footer>
        <slot name="footer" />
      </template>
    </BodyCard>
  </div>
</template>

<script>
// ============================== 导入依赖 ============================== //

import CORE from '@/CORE'
import props from './props'
import BodyCard from './BodyCard'

// ============================== 导出组件 ============================== //

export default {
  /**
   * 名称定义 (实际使用名称)
   */
  name: 'CommonBody',

  /**
   * 混入列表 (配置选项合并)
   */
  mixins: [CORE.mixApiMenu()],

  /**
   * 组件导入 (Abc.vue + Abc/index.vue)
   */
  ...CORE.components(require.context('./', true, /vue$/)),

  /**
   * 属性注册 (抽取以便查阅)
   */
  props,

  /**
   * 计算属性 (慎用箭头函数)
   */
  computed: BodyCard.computed,

  /**
   * 本地方法 (轻量重要在前)
   */
  methods: {
    /**
     * 切换节点
     */
    toChange(data) {
      this.$emit('change', data)
    },

    /**
     * 点击展开
     */
    toExpand(data) {
      this.$emit('expand', data)
    },

    /**
     * 点击收缩
     */
    toCollapse(data) {
      this.$emit('collapse', data)
    },
  },
}
</script>

<style lang="scss">
@import './index.scss';
</style>
